﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once
#include "GcmpCollaborationInterface.h"
#include "GbmpQuickCast.h"
#include <vector>

namespace gcmp
{
    class IElement;
    class IDocument;
    class UniIdentity;

    /// \brief 构件协同对象访问工具
    class GCMP_COLLABORATION_INTERFACE_EXPORT IElementCollaborationElementAccess
    {
        DEFINE_CAST_BASE(gcmp::IElementCollaborationElementAccess)
    public:
        /// \brief 获取实例对象
        static IElementCollaborationElementAccess * Get();

        /// \brief 按照类别获取对象的最新版本的错误码
        enum class ErrorCode : int32_t
        {
            OK = 0,                             /// < 成功
            NotReady = 1,                       /// < 没有做好查询的准备。比如查询模块未加载
            QueryFailed = 2,                    /// < 查询版本失败
            DownloadFailed = 3,                 /// < 下载失败
            AddToDocumentFailed = 4,            /// < 加载到文档失败
            AcquireEditPrivilegeFailed = 5,     /// < 申请修改权限失败
        };

        /// \brief 返回结果
        struct Result
        {
            ErrorCode Code = ErrorCode::OK;     /// < 错误码
            std::wstring Message;               /// < 错误消息
        };

        /// \brief 输入参数
        struct InParameter
        {
            std::wstring ProjectId; /// < 项目Id
            std::wstring MajorType; /// < 专业
            std::wstring DatasetId; /// < 工作单元Id
        };

        /// \brief 按照类别获取对象的最新版本
        ///
        /// 先查询云端最新版本，如果本地文档内不是最新的，则会从云端下载。
        /// \param pDocument        文档
        /// \param commonParameter  通用输入参数
        /// \param category         类别
        /// \param version          版本。-1表示希望获取最新
        /// \param result           结果
        /// \return 对象指针数组
        virtual std::vector<const IElement*> GetElementOfVersion(
            IDocument * pDocument,
            const InParameter & commonParameter,
            const UniIdentity & category,
            int32_t version,
            Result & result
        ) const = 0;

        /// \brief 按照类别获取对象的最新版本，用来修改
        ///
        /// 先查询云端最新版本，如果本地文档内不是最新的，则会从云端下载。
        /// 会同时申请修改权限。
        ///
        /// \param pDocument        文档
        /// \param commonParameter  通用输入参数
        /// \param category         类别
        /// \param result           结果
        /// \return 对象指针数组
        virtual std::vector<IElement*> GetElementOfVersionForWrite(
            IDocument * pDocument,
            const InParameter & commonParameter,
            const UniIdentity & category,
            Result & result
        ) const = 0;

    public:
        virtual ~IElementCollaborationElementAccess() = 0;

    protected:
        static IElementCollaborationElementAccess * s_instance;
    };
}
